package org.example.review.config;

import feign.Feign;
import feign.Logger;
import feign.Request;
import feign.Retryer;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import feign.slf4j.Slf4jLogger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

/**
 * OpenFeign 配置类（纯OpenFeign，不依赖Spring Cloud）
 */
@Configuration
public class FeignConfig {

    @Value("${feign.apply-service.url:http://localhost:8081}")
    private String applyServiceUrl;

    /**
     * 配置Feign日志级别
     * NONE: 不记录日志（默认）
     * BASIC: 仅记录请求方法、URL、响应状态码及执行时间
     * HEADERS: 记录BASIC + 请求和响应的header
     * FULL: 记录所有信息（header、body、元数据）
     */
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    /**
     * 配置超时时间
     * connectTimeout: 连接超时时间
     * readTimeout: 读取超时时间
     */
    @Bean
    public Request.Options requestOptions() {
        return new Request.Options(
                10, TimeUnit.SECONDS,  // 连接超时 10秒
                60, TimeUnit.SECONDS,  // 读取超时 60秒
                true                   // 跟随重定向
        );
    }

    /**
     * 配置重试策略
     * period: 重试间隔（毫秒）
     * maxPeriod: 最大重试间隔（毫秒）
     * maxAttempts: 最大重试次数
     */
    @Bean
    public Retryer retryer() {
        return new Retryer.Default(
                100,   // 初始重试间隔 100ms
                1000,  // 最大重试间隔 1000ms
                3      // 最多重试 3 次
        );
    }

    /**
     * JSON编码器
     */
    @Bean
    public JacksonEncoder jacksonEncoder() {
        return new JacksonEncoder();
    }

    /**
     * JSON解码器
     */
    @Bean
    public JacksonDecoder jacksonDecoder() {
        return new JacksonDecoder();
    }

    /**
     * SLF4J日志记录器
     */
    @Bean
    public Slf4jLogger slf4jLogger() {
        return new Slf4jLogger();
    }

    /**
     * 创建Feign Builder
     * 用于构建Feign客户端实例
     */
    @Bean
    public Feign.Builder feignBuilder() {
        return Feign.builder()
                .encoder(jacksonEncoder())
                .decoder(jacksonDecoder())
                .logger(slf4jLogger())
                .logLevel(feignLoggerLevel())
                .options(requestOptions())
                .retryer(retryer());
    }
}
